# Определение длины ASCIZ-строки
# Вход: Адрес буфера -> a0
# Выход: Длина строки -> a0
_strlen:
	push	ra
	mv      t0 zero         # счётчик символов
	li	t2 0x0a		# символ конца строки
loop_strlen:
	lb      t1 (a0)         # очередной символ
        beqz    t1 fin_strlen	# нулевой — конец строки
        beq	t1 t2 fin_strlen# символ конца строки
        addi    t0 t0 1         # увеличим счётчик
	addi    a0 a0 1         # следующий символ
        b       loop_strlen
fin_strlen:   
	mv      a0 t0
        pop	ra
	ret	


# Ввод ASCIZ-строки длиной не более 100 байтов. Ввод происходит в статический буфер, далее для строки выделяется соответствующее место на куче, и она копируется
# туда (\n, если есть, из строки удаляется, в конец обязательно записывается 0).
# Вход: -
# Выход: Адрес выделенной памяти -> a0, Длина строки -> a1
_strget:
	push	ra
	push	s1
	la	s1 buf
	mv      a0 s1		# ввод в статический буфер
	li	a1 STRSIZE
	li	a7 8
	ecall
	strip	s1 '\n'
	strlen	s1 a0		# получим длину строки
	addi	a0 a0 1		
	syscall 9 a0            # Закажем память (объём уже в a0)
        strcpy	a0 s1 a1
	pop	s1
	pop	ra
	ret


# Копирует ASCIZ-источник по адрсу «приёмник»
# Вход: Приёмник -> a0, Источник -> a1
# Выход: Приёмник -> a0, Длина строки -> a1
_strcpy:
	push	ra
	mv	t0 zero
	mv	t2 a0		
loop_strcpy:  
	lb      t1 (a1)
	sb      t1 (t2)        
        beqz    t1 fin_strcpy
        addi    t0 t0 1         # увеличим счётчик
	addi    t2 t2 1         # следующий символ
	addi    a1 a1 1
	b       loop_strcpy
fin_strcpy:	
	mv	a1 t0
	pop	ra
	ret 
	

# Вспомогательная процедура удаления хвостового '\n'
# Вход: Адрес выделенной памяти -> a0, Код символа -> a1
# Выход: -
_strip:
	push	ra
loop_strip:  
	lb      t0 (a0)
        beqz    t0 fin_strip
        beq	t0 a1 delch_strip
	addi    a0 a0 1
        b       loop_strip
delch_strip:	
	sb	zero (a0)
fin_strip:   
	pop	ra
	ret


# Лексикографическое сравнение ASCIZ-строк. Возвращает отрицательное число, если первая строка меньше, положительное, если больше и ноль, если строки равны.
# Вход: Адрес 1 -> a0, Адрес 2 -> a1
# Выход: Результат -> a0
_strcmp:
	push	ra
	mv	t0 zero
loop_strcmp:  
	lb      t1 (a0)
	lb	t2 (a1)
        beq     t1 t2 eq_strcmp
        bgt	t1 t2 gr_strcmp
        addi	t0 t0 -1
        b	fin_strcmp
eq_strcmp:	
	beqz	t1 fin_strcmp	
	addi    a0 a0 1
	addi	a1 a1 1
        b       loop_strcmp
gr_strcmp:	
	addi	t0 t0 1
fin_strcmp:   
	mv	a0 t0
	pop	ra
	ret


# Возвращает адрес первого вхождения символа char в строку по адресу addr1 или 0, если символ в строке отсутствует
# Вход: Адрес 1 -> a0, Символ -> a1
# Выход: Результат -> a0
_strchr:
	push	ra
	mv	t0 zero
loop_strchr:  
	lb      t1 (a0)
	beq     t1 a1 fin_strchr
	beqz	t1 eqz_strchr	
	addi    a0 a0 1
	b       loop_strchr
eqz_strchr:	
	mv	a0 zero
fin_strchr:   
	pop	ra
	ret


_input: # a0 — message / a7 — input value
        li      a7 4
        ecall
        li      a7 5
        ecall
        ret

_print: # a0 — message, a1 — number
        li      a7 4
        ecall
        mv      a0 a1
        li      a7 1
        ecall
        li      a0 10
        li      a7 11
        ecall
        ret
